'''
里氏替换原则：
1、凡是引用基类的地方，均可用其子类进行替换。
    （基类：不是抽象类，是一个实现了具体方法的类）
    （即子类尽量不要重写父类的方法。）
2、适当情况下，可通过聚合、组合、依赖等来解决问题。（既两个类可以继承一个更加基础的类或者是抽象类）

依赖、聚合、组合：（假定两个类对象 A、B）
1、依赖：B在A中被引用，称之为A依赖于B。
2、聚合：A与B有关联，但二者均可独立存在。如：公司与员工，二者不会随着另一方的小时而消失。
3、组合：组成、构成的关系。如人与大脑，大脑是组成人的一个器官，人与大脑不能分开独立存在。
'''


'''
=====>>> 下面是违背里氏替换原则的
'''
class Parent(object):

    def method1(self, a, b):
        return a + b


class Children(Parent):

    def method1(self, a, b):
        # 重写了父类方法，在用子类替换父类时，便会有不同的结果了 | 既然是这样，那完全可以 不继承Parent类
        return a - b

    def method2(self, a, b):
        return self.method1(a, b) + 9


'''
=======>>>>> 以下是符合里氏替换原则的
二者都继承Base，这样即便是B中使用了A中方法，也不会因为A的异常就无法使用B。
'''
class Base(object):  # 此处用非抽象类演示 | 一般这种多继承抽象类
    pass


class ClassA(Base):
    
    def method1(self, a, b):
        return a + b


class ClassB(Base):

    def method1(self, a, b):
        return a - b

    def method2(self, a, b):
        return self.method1(a, b) + 9

    def method3(self, a, b):
        # 依旧要使用ClassA的方法时
        A = ClassA()  # 添加对ClassA的依赖
        return A.method1(a, b)
